package com.demo.util;


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.Date;

public class BeanUtils {
    /**
     *  负责基本类型的 对象赋值处理 8种基本数据类型
     * @param clazz
     * @param obj
     * @param field
     * @param value
     * @throws Exception
     */
    public static void baseAttributeAssign(Class clazz,Object obj, Field field,String value) throws Exception {
        String fieldName = field.getName();
        Method declaredMethod = clazz.getDeclaredMethod(StringUtils.getSetMethod(fieldName), field.getType());
        String fieldTypeName = field.getType().getName();
        // 默认 只能实例化String类型的，因为有其他类型的所以，我们要进行类型转换
        Object val = convertValueByString(fieldTypeName,value);
        declaredMethod.invoke(obj,val);
    }

    /**
     * @Value 注解中，或配置文件中的 值都是string类型的，我们需要把值做一个类型转换
     * @param type 类型
     * @param v 值
     * @return
     */
    public static Object convertValueByString(String type,String v){
        switch (type){
            case "java.lang.String":
                return v;
            case "java.lang.Integer":
                return Integer.parseInt(v);
            case "java.lang.Double":
                return Double.parseDouble(v);
            case"java.lang.Long":
                return Long.valueOf(v);
            case"java.util.Date":{
                LocalDateTime localDateTime = LocalDateTime.parse(v,DateUtils.DATE_TIME_FORMATTER);
                Instant instant = localDateTime.atZone(DateUtils.ZONE_ID).toInstant();
                return Date.from(instant);
            }
            case"java.time.LocalDateTime":{
                LocalDateTime localDateTime = LocalDateTime.parse(v,DateUtils.DATE_TIME_FORMATTER);
                return localDateTime;
            }

        }
        return null;
    }

    /**
     * 给一个对象 的对象属性赋值
     * @param target 赋值对象
     * @param targetClazz 赋值对象的class文件
     * @param inject 注入的对象
     * @param field 赋值对象的field
     * @throws Exception
     */
    public static void objectAttributeAssign(Object target,Class targetClazz,Object inject,Field field) throws Exception {
        String fileName = field.getName(); //得到属性名，进而得到set方法
        String typeName = field.getType().getName(); //属性类型
        String name = inject.getClass().getName(); //注入的对象的类型
        if(typeName.equals(name)){ //属性相同，进行注入，否则会出错
            Method method = targetClazz.getDeclaredMethod(StringUtils.getSetMethod(fileName), field.getType());
            method.invoke(target,inject);
        }

    }
}
